{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n",
      "/usr/local/python3/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:526: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "/usr/local/python3/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:527: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "/usr/local/python3/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:528: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "/usr/local/python3/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:529: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "/usr/local/python3/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:530: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "/usr/local/python3/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:535: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "channels_last\n"
     ]
    }
   ],
   "source": [
    "# -*- coding: utf-8 -*-\n",
    "from keras.datasets import mnist                #从keras.datasets中导入mnist.py文件\n",
    "from keras.utils import to_categorical          #从keras.utils库中导入to_categorical方法\n",
    "#to_categorical就是将类别向量转换为二进制（只有0和1）的矩阵类型表示。其表现为将原有的类别向量转换为独热编码的形式\n",
    "import numpy as np                              #导入numpy\n",
    "from keras import utils as np_utils\n",
    "#from numpy.utils import to_categorical\n",
    "\n",
    "  # force a channel ordering\n",
    "from keras import backend\n",
    "  # force channels-first ordering\n",
    "#backend.set_image_data_format('channels_first')\n",
    "print(backend.image_data_format())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 28, 28) (60000,)\n",
      "(10000, 28, 28) (10000,)\n"
     ]
    }
   ],
   "source": [
    "#导入mnist数据集====================================================================================================\n",
    "#train_X, train_y = mnist.load_data()[0]\n",
    "path='./mnist.npz'                              #利用numpy读入mnist数据集\n",
    "f = np.load(path)\n",
    "train_X, train_y = f['x_train'], f['y_train']   #获取训练集的特征矩阵赋值给变量train_X，获取训练集的标签赋值给变量train_y；\n",
    "test_X, test_y = f['x_test'], f['y_test']       #获取测试集的数据的特征赋值test_X，标签赋值给变量test_y；\n",
    "f.close()\n",
    "print(train_X.shape, train_y.shape)            #输出训练集的维度 (60000, 28, 28) (60000,)\n",
    "print(test_X.shape, test_y.shape) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train_X的维度： (60000, 28, 28, 1)\n",
      "train_X的数据类型： float32\n",
      "train_X的维度： (60000, 10)\n"
     ]
    }
   ],
   "source": [
    "#训练数据预处理=================================================================================================================\n",
    "train_X = train_X.reshape( -1,28, 28,1)       #reshape成网络需要的数据格式\n",
    "print(\"train_X的维度：\",train_X.shape)\n",
    "train_X = train_X.astype('float32')            #训练数据的数据类型设为float32\n",
    "print(\"train_X的数据类型：\",train_X.dtype)\n",
    "train_X /= 255                                 #归一化，标准化\n",
    "train_y = to_categorical(train_y, 10)   \n",
    "print(\"train_X的维度：\",train_y.shape)\n",
    "\n",
    "#未转化第一个数是 5\n",
    "#print(train_y[:1])\n",
    "train_yOneHot = np_utils.to_categorical(train_y)\n",
    "#转化  One-Hot Encoding 都是以0 1 表示，5 在第六个位置\n",
    "#print(train_yOneHot[:1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /usr/local/python3/lib/python3.7/site-packages/tensorflow/python/ops/resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n",
      "Model: \"sequential_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d_1 (Conv2D)            (None, 28, 28, 16)        160       \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 14, 14, 16)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 14, 14, 32)        4640      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 7, 7, 32)          0         \n",
      "_________________________________________________________________\n",
      "flatten_1 (Flatten)          (None, 1568)              0         \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 1568)              0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 128)               200832    \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 206,922\n",
      "Trainable params: 206,922\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "模型梗概： None\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.layers.convolutional.Conv2D at 0x7fb4f44e6940>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#网络构建========================================================================================================\n",
    "from keras.models import Sequential                                     #导入keras中的模型方法\n",
    "from keras.layers import Conv2D, MaxPool2D, Flatten, Dropout, Dense     #导入keras中的层函数：卷积、池化、铺平、dropout、全连接\n",
    "from keras.losses import categorical_crossentropy                       #导入keras中损失函数\n",
    "from keras.optimizers import Adadelta                                   #导入keras中的优化器\n",
    "#模型训练并保存========================================================================================================\n",
    "model = Sequential()                                                    #用keras.model库的Sequential方法实例化模型对象；\n",
    "model.add(Conv2D(16, (3,3), activation='relu', padding='same',input_shape=[28, 28,1]))     #c1\n",
    "model.add(MaxPool2D(pool_size=(2,2)))                                                      #s2\n",
    "model.add(Conv2D(32, (3,3), activation='relu',padding='same'))                             #c3\n",
    "model.add(MaxPool2D(pool_size=(2,2)))                                                      #s4\n",
    "model.add(Flatten())                                                                       #Flatten5\n",
    "model.add(Dropout(0.5))                                                                    #dropout6\n",
    "model.add(Dense(128, activation='relu'))                                                   #fc7\n",
    "model.add(Dropout(0.5))                                                                    #dropout8\n",
    "model.add(Dense(10, activation='softmax'))                                                 #fc9\n",
    "print(\"模型梗概：\",model.summary())   #查看模型摘要\n",
    "#model,save('my5ceng.h5')\n",
    "model.get_layer(index=0)      #依据层名或下标获得层对象"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /usr/local/python3/lib/python3.7/site-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.cast instead.\n",
      "Train on 48000 samples, validate on 12000 samples\n",
      "Epoch 1/10\n",
      "48000/48000 [==============================] - 18s 378us/step - loss: 0.4127 - accuracy: 0.8670 - val_loss: 0.0907 - val_accuracy: 0.9742\n",
      "Epoch 2/10\n",
      "48000/48000 [==============================] - 18s 374us/step - loss: 0.1575 - accuracy: 0.9514 - val_loss: 0.0669 - val_accuracy: 0.9797\n",
      "Epoch 3/10\n",
      "48000/48000 [==============================] - 18s 374us/step - loss: 0.1276 - accuracy: 0.9612 - val_loss: 0.0577 - val_accuracy: 0.9827\n",
      "Epoch 4/10\n",
      "48000/48000 [==============================] - 18s 376us/step - loss: 0.1111 - accuracy: 0.9665 - val_loss: 0.0497 - val_accuracy: 0.9847\n",
      "Epoch 5/10\n",
      "48000/48000 [==============================] - 18s 373us/step - loss: 0.1017 - accuracy: 0.9689 - val_loss: 0.0475 - val_accuracy: 0.9852\n",
      "Epoch 6/10\n",
      "48000/48000 [==============================] - 18s 375us/step - loss: 0.0909 - accuracy: 0.9731 - val_loss: 0.0447 - val_accuracy: 0.9857\n",
      "Epoch 7/10\n",
      "48000/48000 [==============================] - 18s 376us/step - loss: 0.0873 - accuracy: 0.9738 - val_loss: 0.0406 - val_accuracy: 0.9874\n",
      "Epoch 8/10\n",
      "48000/48000 [==============================] - 18s 373us/step - loss: 0.0821 - accuracy: 0.9751 - val_loss: 0.0398 - val_accuracy: 0.9881\n",
      "Epoch 9/10\n",
      "48000/48000 [==============================] - 19s 387us/step - loss: 0.0784 - accuracy: 0.9762 - val_loss: 0.0386 - val_accuracy: 0.9879\n"
     ]
    }
   ],
   "source": [
    "#开始训练模型================================================================================================\n",
    "#x 是训练数据集， y 是训练数据集的标签， validation_split 是把训练数据集分为 8 份训练数据集 2 份验证集\n",
    "#epochs 是迭代次数 20， batch_size 是批量 256， verbose 为 2 显示训练过程\n",
    "model.compile(loss=categorical_crossentropy,    #指定模型的损失函数、优化器、评判指标（AP）\n",
    "             optimizer=Adadelta(),\n",
    "             metrics=['accuracy'])\n",
    "\n",
    "batch_size = 100                         #每次模型训练使用100个样本数量\n",
    "epochs = 10                              #所有样本遍历10次\n",
    "from numpy import *\n",
    "from keras.callbacks import EarlyStopping   #早挺\n",
    "callbacks=[EarlyStopping(monitor='val_accuracy', min_delta=0,\n",
    "                              patience=0, verbose=0, mode='auto',\n",
    "                              baseline=None, restore_best_weights=False)]\n",
    "train_history=model.fit(train_X, train_y,                  #训练特征矩阵、训练标签、batch_size大小、epochs大小、验证集比例\n",
    "         batch_size=batch_size,validation_split = 0.2,\n",
    "         epochs=epochs,callbacks=callbacks)\n",
    "#keras的模型一般保存为后缀名为h5的文件，比如final_model.h5。同样是h5文件用save()和save_weight()保存效果是不一样的。\n",
    "#\n",
    "model.save(\"model1.h5\") "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 1s 134us/step\n",
      "loss:0.0330 accuracy:0.9891\n"
     ]
    }
   ],
   "source": [
    "#模型测试========================================================================================================\n",
    "#测试数据集预处理\n",
    "test_X = test_X.reshape(-1, 28, 28, 1)    #将原始的特征矩阵做数据处理形成模型需要的数据\n",
    "test_X = test_X.astype('float32')\n",
    "test_X /= 255\n",
    "test_y = to_categorical(test_y, 10)       #使用keras中的to_categorical方法对数字的标签分类做One-Hot编码\n",
    "loss, accuracy = model.evaluate(test_X, test_y, verbose=1)    #使用测试集的数据做模型评估，打印损失函数值和准确率\n",
    "print('loss:%.4f accuracy:%.4f' %(loss, accuracy))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#画出训练损失和正确率曲线图=============================================================================================\n",
    "import matplotlib.pyplot as plt\n",
    "def show_train_history(train_history, train, validation):\n",
    "    plt.plot(train_history.history[train])\n",
    "    plt.plot(train_history.history[validation])\n",
    "    plt.title('Train History')\n",
    "    plt.ylabel(train)\n",
    "    plt.xlabel('Epoch')\n",
    "    plt.legend(['train', 'validation'], loc = 'upper left')\n",
    "    plt.show()\n",
    "show_train_history(train_history, 'loss', 'val_loss')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_train_history(train_history, 'accuracy', 'val_accuracy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
